#include <REGX52.H>
#include "TimeR0.h"
#include "INT0.h"

unsigned int IR_Time;
unsigned char IR_State;//假设每一帧为一个单位（Start,Repeat分别为一帧）
//0：空闲 1：起始 2：传送

unsigned char IR_Data[4];//存储4个字节，32位，表示发送数据的长度
unsigned char IR_pData;//反映当前存储的第几位

unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;//连发帧标志位

unsigned char IR_Address;
unsigned char IR_Command;

/**
  * @brief  红外遥控初始化
  * @param  无
  * @retval 无
  */
void IR_Init()
{
	IR_Timer0_Init();
	Int0_Init();
}


/**
  * @brief  红外遥控获取收到数据帧标志位
  * @param  无
  * @retval 是否收到数据帧，1为收到，0为未收到
  */
unsigned char IR_GetDataFlag(void)
{
	if(IR_DataFlag)
	{
		IR_DataFlag=0;//为下次做准备
		return 1;
	}
	return 0;
}


/**
  * @brief  红外遥控获取收到连发帧标志位
  * @param  无
  * @retval 是否收到连发帧，1为收到，0为未收到
  */
unsigned char IR_GetRepeatFlag(void)
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag=0;//为下次做准备
		return 1;
	}
	return 0;
}


/**
  * @brief  红外遥控获取收到的地址数据
  * @param  无
  * @retval 收到的地址数据
  */
unsigned char IR_GetAddress(void)
{
	return IR_Address;
}


/**
  * @brief  红外遥控获取收到的命令数据
  * @param  无
  * @retval 收到的命令数据
  */
unsigned char IR_GetCommand(void)
{
	return IR_Command;
}

//外部中断0中断函数，下降沿触发执行
void Int0_Routine(void) interrupt 0
{
	//高电平定义为0，下降延后开始解码，定义为1
	if(IR_State==0)//默认状态（空闲）
	{
		IR_Timer0_SetCounter(0);
		IR_Timer0_Run(1);//状态1，等待Start信号或Repeat信号
		IR_State=1;
	}
	else if(IR_State==1)
	{
		//P2=0;//没有判断出信号
		IR_Time=IR_Timer0_GetCounter();
		IR_Timer0_SetCounter(0);//为下一次计数做准备
		//判断是Start信号还是Repeat信号
		//计数器加1就是1us
		//如果计时为13.5ms，则接收到了Start信号（判定值在12MHz晶振下为13500，在11.0592MHz晶振下为12442）
		if(IR_Time>12442-500&&IR_Time<12442+500)//因为有误差，所以不能直接写==
		{
			//P2=0;//判断出信号
			IR_State=2;//下次开启中断就要解码数据了
		}
		//如果计时为11.25ms，则接收到了Repeat信号（判定值在12MHz晶振下为11250，在11.0592MHz晶振下为10368）
		else if(IR_Time>10386-500&&IR_Time<10386+500)
		{
			//接收到Repeat信号说明这一帧已经结束了，后面就不用数据了
			IR_RepeatFlag=1;
			IR_Timer0_Run(0);//停止定时器，这句可以不写
			IR_State=0;//变成空闲状态
		}
		else//其他条件（点睛之笔）（可以不写）
		{
			IR_State=1;//如果出错的话，继续搜寻起始信号
		}
	}
	else if(IR_State==2)
	{
		IR_Time=IR_Timer0_GetCounter();
		IR_Timer0_SetCounter(0);
		//如果计时为1120us，则接收到了数据0（判定值在12MHz晶振下为1120，在11.0592MHz晶振下为1032）
		if(IR_Time>1032-500&&IR_Time<1032+500)
		{
			IR_Data[IR_pData/8]&=~(0x01<<IR_pData%8);//0
			IR_pData++;
			IR_DataFlag=1;
		}
		//如果计时为2250us，则接收到了数据1（判定值在12MHz晶振下为2250，在11.0592MHz晶振下为2074）
		else if (IR_Time>2074-500&&IR_Time<2074+500)
		{
			IR_Data[IR_pData/8]|=(0x01<<IR_pData%8);//1
			IR_pData++;
			IR_DataFlag=1;
		}
		else//传送错了，直接开始下一次
		{
			IR_pData=0;
			IR_State=1;
		}
		if(IR_pData>=32)//表示发送完毕
		{
			IR_pData=0;
			if((IR_Data[0]==~IR_Data[1])&&(IR_Data[2]==~IR_Data[3]))
			{
				IR_Address=IR_Data[0];
				IR_Command=IR_Data[2];
				IR_DataFlag=1;
			}
			IR_Timer0_Run(0);
			IR_State=0;
		}
	}	
}